home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / hobbes3 / circle.asm < prev    next >
Encoding:
Assembly Source File  |  1992-08-17  |  8.6 KB  |  404 lines

  1. include hobbes.inc
  2. include extrn.inc
  3.  
  4. EXTRN _HLineClipR
  5.  
  6. .CODE
  7.  
  8. ;----------------------------------------------------------------------------
  9. ; void PixelR(void);
  10. ; uses register-based paramater passing
  11. ;    ax=posX
  12. ;    cx=posY
  13. ;    bx=COLOR
  14. _PixelR proc
  15. ;        push    bp
  16. ;        mov     bp,sp
  17.         push    ax
  18.         push    bx
  19.         push    dx
  20.         push    ds
  21. ;duh. if i am saving all these stupid registers, then there's really no point
  22. ;in using register parameter-passing, is there?  ugh
  23.         mov     cx,@data
  24.         mov     ds,cx
  25. pc_okay:
  26.         mov     es,_ModeX_Segment     ; put video segment in ES
  27.  
  28. ;    ax=posX
  29. ;    bx=posY
  30. ;    dx=COLOR
  31.  
  32. ;        mov     bx,Y
  33.         shl     bx,1
  34.         mov     bx,word ptr _RowOffset[bx]
  35.         add        bx,_Display_Offset
  36. ;        mov     ax,X
  37.         mov     cl,al           ; prepare CL to compute plane
  38.         shr     ax,2            ; X/4 = offset of pixel in scan line
  39.         add     bx,ax           ; final offset of pixel in page
  40.  
  41.         and     cl,011b         ; CL = pixel's plane
  42.         mov     ax,1100h+MAP_MASK ; AL = index in SC of Map Mask reg
  43.         shl     ah,cl           ; set only the bit for the pixel's plane to 1
  44.         mov        cx,dx            ; move the COLOR
  45.         mov     dx,SC_INDEX     ; set the Map Mask to enable only
  46.         out     dx,ax           ;   the pixel's plane
  47.  
  48. ;        mov     al,dl
  49.         mov     es:[bx],cl      ; draw the pixel in the desired color
  50.  
  51.         pop     ds
  52.         pop        dx
  53.         pop        bx
  54.         pop        ax
  55. ;        pop     bp
  56.         ret
  57. _PixelR          endp
  58.  
  59.  
  60.  
  61. ;----------------------------------------------------------------------------
  62. ; void Circle(int x_center, int y_center, int radius, COLOR)
  63. ;
  64. ;    public _Circle
  65. _Circle     proc     far
  66. ARG X_CENTER:WORD, Y_CENTER:WORD, RADIUS:WORD, COLOR:WORD
  67. LOCAL X:WORD, Y:WORD, D:WORD, deltaE:WORD, deltaSE:WORD = STACKSIZE
  68.     push     bp
  69.     mov        bp,sp
  70.     sub        bp,STACKSIZE
  71.     push    ds
  72.     mov        ax,@data
  73.     mov        ds,ax
  74.     push    si
  75.     push    di
  76.  
  77.     ;x=0
  78.     mov        X,0
  79.  
  80.     ;y=radius
  81.     mov        ax,RADIUS
  82.     mov        Y,ax
  83.     neg        ax
  84.     inc        ax
  85.     ;d=1-radius
  86.     mov        D,ax
  87.  
  88.     ;deltaE=3
  89.     mov        deltaE,3
  90.  
  91.     ;deltaSE=-2*radius+5
  92.     dec        ax
  93.     sar        ax,1
  94.     add        ax,5
  95.  
  96.     jmp        @@CirclePoints
  97.  
  98. @@StartLoop:
  99.  
  100.     mov        ax,Y
  101.     cmp        ax,X
  102.     jg        @@While
  103.     jmp        @@Done
  104. ;    WHILE (y < x)
  105. @@While:
  106.     mov        ax,d
  107.     cmp        ax,0
  108.     je        @@elseif
  109. ;    IF (d < 0)
  110.     mov        ax,deltaE
  111.     add        d,ax
  112.     inc        deltaE
  113.     inc        deltaE
  114.     inc        deltaSE
  115.     inc        deltaSE
  116.     inc        x
  117. @@elseif:
  118. ;    ELSE
  119.     mov        ax,deltaSE
  120.     add        d,ax
  121.     inc        deltaE
  122.     inc        deltaE
  123.     add        deltaSE,4
  124.     inc        x
  125.     dec        y
  126. ;    ENDIF
  127.     jmp        @@StartLoop
  128. ;    ENDWHILE
  129.  
  130.  
  131. @@CirclePoints:
  132.     mov        dx,COLOR
  133.     mov        ax,X_CENTER
  134.     add        ax,X
  135.     mov        bx,Y_CENTER
  136.     add        bx,Y
  137.     call    _PixelR
  138. ;    Pixel( x+X_CENTER, y+Y_CENTER, COLOR);
  139.     sub        ax,X
  140.     sub        ax,X
  141.     call    _PixelR
  142. ;    Pixel(-x+X_CENTER, y+Y_CENTER, COLOR);
  143.     sub        bx,Y
  144.     sub        bx,Y
  145.     call    _PixelR
  146. ;    Pixel(-x+X_CENTER,-y+Y_CENTER, COLOR);
  147.     add        ax,X
  148.     add        ax,X
  149.     call    _PixelR
  150. ;    Pixel( x+X_CENTER,-y+Y_CENTER, COLOR);
  151.  
  152.     mov        ax,X_CENTER
  153.     add        ax,Y
  154.     mov        bx,Y_CENTER
  155.     add        bx,X
  156.     call    _PixelR
  157. ;    Pixel( y+X_CENTER, x+Y_CENTER, COLOR);
  158.     sub        ax,Y
  159.     sub        ax,Y
  160.     call    _PixelR
  161. ;    Pixel(-y+X_CENTER, x+Y_CENTER, COLOR);
  162.     sub        bx,X
  163.     sub        bx,X
  164.     call    _PixelR
  165. ;    Pixel(-y+X_CENTER,-x+Y_CENTER, COLOR);
  166.     add        ax,Y
  167.     add        ax,Y
  168.     call    _PixelR
  169. ;    Pixel( y+X_CENTER,-x+Y_CENTER, COLOR);
  170.     jmp        @@StartLoop
  171.  
  172. @@Done:
  173.     pop        di
  174.     pop        si
  175.     pop        ds
  176.     pop        bp
  177.     ret
  178. _Circle endp
  179.  
  180.  
  181.  
  182.  
  183. ;-----------------------------------------------------------------------
  184. ; void CircleFill( int x_center, int y_center, int radius, char color)
  185. ;
  186.         public  _CircleFill
  187. _CircleFill   proc    far
  188. ARG    X_CENTER:WORD, Y_CENTER:WORD, Radius:WORD, Color:WORD
  189.         push    bp
  190.         mov     bp,sp
  191.         push    ds
  192.         mov     ax,@data
  193.         mov     ds,ax
  194.         push    si
  195.         push    di
  196.  
  197.         mov     si,0                ; si has X variable
  198.         mov     di,RADIUS           ; di has Y variable
  199.  
  200.         mov     ax,X_CENTER
  201.         mov     dx,ax
  202.         sub     ax,di
  203.         add     dx,di
  204.         mov     cx,Y_CENTER
  205.         mov     bx,COLOR
  206.         call    far ptr far ptr _HLineClipR
  207. ;        HLineClip( x_center-y, x_center+y, y_center, color );
  208.  
  209.         mov     bx,RADIUS
  210.         shl     bx,1
  211.         mov     ax,3
  212.         sub     ax,bx               ; ax has P variable
  213. @@DiscTop:
  214.         cmp     si,di
  215.         jge     @@DiscDone            ; Check for done
  216.  
  217.         cmp     ax,0
  218.         jge     @@Disc_2              ; Check if P greater than zero
  219.         mov     dx,si
  220.         shl     dx,2
  221.         add     dx,6
  222.         adc     ax,dx               ; p+=(x<<2)+6
  223.         jmp     short   @@DiscCommon
  224. @@Disc_2:
  225.         push    ax              ; Save P variable
  226.  
  227.         mov     ax,X_CENTER
  228.         mov     dx,ax
  229.         sub     ax,si
  230.         add     dx,si
  231.         push    ax              ; Save X1 for later
  232.         push    dx              ; Save X2 for later
  233.         mov     cx,Y_CENTER
  234.         sub     cx,di
  235.         mov     bx,COLOR
  236.         call    far ptr _HLineClipR
  237. ;        HLineClip( x_center-x, x_center+x, y_center-y, color );
  238.         pop     dx              ; Get X2 back
  239.         pop     ax              ; Get X1 back
  240.         mov     cx,Y_CENTER
  241.         add     cx,di
  242.         mov     bx,COLOR
  243.         call    far ptr _HLineClipR
  244. ;        HLineClip( x_center-x, x_center+x, y_center+y, color );
  245.  
  246.         pop     ax              ; Get P variable back
  247.  
  248.         mov     dx,si
  249.         sub     dx,di
  250.         dec     di
  251.         shl     dx,2
  252.         add     dx,10
  253.         adc     ax,dx
  254.  
  255.         ; Fall through into common code
  256. @@DiscCommon:
  257.         inc     si                  ; x++
  258.  
  259.         push    ax              ; Save P variable
  260.  
  261.         mov     ax,X_CENTER
  262.         mov     dx,ax
  263.         sub     ax,di
  264.         add     dx,di
  265.         push    ax              ; Save X1 for later
  266.         push    dx              ; Save X2 for later
  267.         mov     cx,Y_CENTER
  268.         sub     cx,si
  269.         mov     bx,COLOR
  270.         call    far ptr _HLineClipR
  271. ;        HLineClip( x_center-y, x_center+y, y_center-x, color );
  272.         pop     dx              ; Get X2 back
  273.         pop     ax              ; Get X1 back
  274.         mov     cx,Y_CENTER
  275.         add     cx,si
  276.         mov     bx,COLOR
  277.         call    far ptr _HLineClipR
  278. ;        HLineClip( x_center-y, x_center+y, y_center+x, color );
  279.  
  280.         pop     ax              ; Get P variable back
  281.         jmp     @@DiscTop
  282.  
  283. @@DiscDone:
  284.         pop     di
  285.         pop     si
  286.         pop     ds
  287.         pop     bp
  288.         ret
  289. _CircleFill   endp
  290.  
  291.  
  292.  
  293.  
  294.  
  295. ;-----------------------------------------------------------------------
  296. ; void CircleFillClip( int x_center, int y_center, int radius, char color)
  297.  
  298.         public  _CircleFillClip
  299. _CircleFillClip   proc    far
  300. ARG    X_CENTER:WORD, Y_CENTER:WORD, RADIUS:WORD, COLOR:WORD
  301.         push    bp
  302.         mov     bp,sp
  303.         push    ds
  304.         mov     ax,@data
  305.         mov     ds,ax
  306.         push    si
  307.         push    di
  308.  
  309.         mov     si,0                ; si has X variable
  310.         mov     di,RADIUS           ; di has Y variable
  311.  
  312.         mov     ax,X_CENTER
  313.         mov     dx,ax
  314.         sub     ax,di
  315.         add     dx,di
  316.         mov     cx,Y_CENTER
  317.         mov     bx,COLOR
  318.         call    far ptr _HLineClipR
  319. ;        HLineClip( x_center-y, x_center+y, y_center, color );
  320.  
  321.         mov     bx,RADIUS
  322.         shl     bx,1
  323.         mov     ax,3
  324.         sub     ax,bx               ; ax has P variable
  325. @@CDiscTop:
  326.         cmp     si,di
  327.         jge     @@CDiscDone            ; Check for done
  328.  
  329.         cmp     ax,0
  330.         jge     @@CDisc_2              ; Check if P greater than zero
  331.         mov     dx,si
  332.         shl     dx,2
  333.         add     dx,6
  334.         adc     ax,dx               ; p+=(x<<2)+6
  335.         jmp     short   @@CDiscCommon
  336. @@CDisc_2:
  337.         push    ax              ; Save P variable
  338.  
  339.         mov     ax,X_CENTER
  340.         mov     dx,ax
  341.         sub     ax,si
  342.         add     dx,si
  343.         push    ax              ; Save X1 for later
  344.         push    dx              ; Save X2 for later
  345.         mov     cx,Y_CENTER
  346.         sub     cx,di
  347.         mov     bx,COLOR
  348.         call    far ptr _HLineClipR
  349. ;        HLineClip( x_center-x, x_center+x, y_center-y, color );
  350.         pop     dx              ; Get X2 back
  351.         pop     ax              ; Get X1 back
  352.         mov     cx,Y_CENTER
  353.         add     cx,di
  354.         mov     bx,COLOR
  355.         call    far ptr _HLineClipR
  356. ;        HLineClip( x_center-x, x_center+x, y_center+y, color );
  357.  
  358.         pop     ax              ; Get P variable back
  359.  
  360.         mov     dx,si
  361.         sub     dx,di
  362.         dec     di
  363.         shl     dx,2
  364.         add     dx,10
  365.         adc     ax,dx
  366.  
  367.         ; Fall through into common code
  368. @@CDiscCommon:
  369.         inc     si                  ; x++
  370.  
  371.         push    ax              ; Save P variable
  372.  
  373.         mov     ax,X_CENTER
  374.         mov     dx,ax
  375.         sub     ax,di
  376.         add     dx,di
  377.         push    ax              ; Save X1 for later
  378.         push    dx              ; Save X2 for later
  379.         mov     cx,Y_CENTER
  380.         sub     cx,si
  381.         mov     bx,COLOR
  382.         call    far ptr _HLineClipR
  383. ;        HLineClip( x_center-y, x_center+y, y_center-x, color );
  384.         pop     dx              ; Get X2 back
  385.         pop     ax              ; Get X1 back
  386.         mov     cx,Y_CENTER
  387.         add     cx,si
  388.         mov     bx,COLOR
  389.         call    far ptr _HLineClipR
  390. ;        HLineClip( x_center-y, x_center+y, y_center+x, color );
  391.  
  392.         pop     ax              ; Get P variable back
  393.         jmp     @@CDiscTop
  394.  
  395. @@CDiscDone:
  396.         pop     di
  397.         pop     si
  398.         pop     ds
  399.         pop     bp
  400.         ret
  401. _CircleFillClip   endp
  402.  
  403.  
  404. END